package Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import Interact.Interface;
import Tool.Tool;

public class SelectionBody extends QuestionBody{
	/** 题面描述 */
	private String cont;
	
	/** 选项 */
	private ArrayList<String> options = new ArrayList<String>();
	
	/** 标准答案，从0计数 */
	private int ans;
	
	public SelectionBody(){
		this(0, null, 0, 0, "", 'a');
	}
	
	public SelectionBody(int id, Course course, int grade, int teacherID, String cont, int ans, String...options){
		super(id, course, grade, teacherID);
		this.cont = cont;
		this.ans = ans;
		for (String str : options)
			this.options.add(str);
	}
	
	@Override
	public void toBytes(OutputStream out) throws IOException {
		getIllustration().toBytes(out);	// 图
		Tool.writeString(cont, out);	// 题目描述
		Tool.writeInt(ans, out);		// 正确答案
		Tool.writeInt(options.size(), out);	// 选项个数
		
		// 选项
		Iterator<String> iter = options.iterator();
		while (iter.hasNext())
			Tool.writeString(iter.next(), out);
	}
	
	@Override
	public void fromBytes(InputStream in) throws IOException {
		getIllustration().fromBytes(in);// 图
		cont = Tool.readString(in);		// 题目描述
		ans = Tool.readInt(in);			// 正确答案
		
		// 选项个数,选项
		options.clear();
		for (int i = Tool.readInt(in); i > 0; --i)
			options.add(Tool.readString(in));
	}

	@Override
	public int getType() {
		return Selection.TYPE;
	}
	
	public String getCont() {
		return cont;
	}
	public void setCont(String cont) {
		this.cont = cont;
	}
	public int getAns() {
		return ans;
	}
	public void setAns(int ans) {
		this.ans = ans;
	}
	
	public Collection<String> getOptions(){
		return options;
	}
	
	public void setOption(int pos, String option){
		options.set(pos, option);
	}
	
	public String getOption(int pos){
		return options.get(pos);
	}
	
	public void pushOption(String option){
		options.add(option);
	}
	
	public void removeOption(int pos){
		options.remove(pos);
	}
	
	public void clearOption(){
		options.clear();
	}

	@Override
	public void display(Interface out) throws IOException {
		String tableID = "'table" + getKey() + "'";
		String ansName = getKey() + "ans";
		
		// 引入库
		out.print("<script language=\"javascript\" src=\"js/common.js\"></script>");
		
		// 脚本，第一部份
		out.print("<script language=\"javascript\">");
		
		// 一个变量
		out.print("var " + getKey() + "selectionBodyInsertValue;\n");
		
		// 每一个cell的格式：确切的说这是一个函数，用来对上面那个变量赋值
		// 卧槽，在这写JS真要人命，完全不知道自己在写什么
		String valueFormat = getKey() + "selectionBodyInsertValue = " +
			"'<textarea name=\"" + getKey() + 
			"optionvalue\">%s</textarea>" +
			"<input type=\"radio\" name=\"selans" + 
			getKey() + "\" onclick=\"selectRightAns(this)\"/>';\n";

		// 赋值，默认值
		out.print(String.format(valueFormat, "在此输入选项描述"));

		// 一个函数，对一个hidden变量赋值，用以提交答案
		out.print("\nfunction selectRightAns(x){\ndocument.getElementsByName(\"" + ansName + "\")[0].value = x.parentElement.parentElement.rowIndex;\n}\n");
		out.print("</script>");
		
		// 好，就是这个hidden变量
		out.print("<input type=\"hidden\" name=\"" + ansName + "\" value=\"" + ans + "\" />");
		
		// 输入题面
		out.print("<h2>题面</h2><br/><textarea name=\"" + getKey()  + "cont\"></textarea>");
		
		// 选项列表开始(一个table)
		out.print("<h2>选项列表</h2>(请输入选项描述，并在选中正确答案选项后的单选框)<br/><table id=" + tableID + "></table>");
		
		// 一个控件，动态添加选项
		out.print("<input type=\"button\" onclick=\"appendRow(" +
				tableID + ", " + getKey() + 
				"selectionBodyInsertValue)\" value=\"添加选项\" />");
		
		// 第二段脚本
		// 本来可以写成一段的：把这写封装在一个函数里，在所需要的地方初始化时调用即可
		// 觉得麻烦就这么写了
		out.print("<script language=\"javascript\">");
		
		// 特别注意，如果cont里有未转义的字符，将会出现不可预知的错误
		if (cont == null || cont.equals(""))
			out.print("document.getElementsByName(\"" + getKey() + "cont\")[0].value=\"请在此输入题目描述\";\n");
		else
			out.print("document.getElementsByName(\"" + getKey() + "cont\")[0].value=\"" + cont + "\";\n");
		
		Iterator<String> iter = options.iterator();
		
		while (iter.hasNext()){
			out.print(String.format(valueFormat, iter.next()));
			out.print("\nappendRow(" + tableID + ", " + getKey() + "selectionBodyInsertValue);\n");
			out.print("alert('foo');\n");
		}
		
		out.print("document.getElementsByName(\"selans" + getKey() + "\")[" + ans + "].checked=true;\n");
		
		out.print("</script>");
	}

	@Override
	public void setValueViaInterface(Interface inf) {
		String value = inf.getValue(getKey() + "cont");
		cont = value == null ? "" : value;
		
		value = inf.getValue(getKey() + "ans");
		
		try{ans = Integer.parseInt(value);}
		catch(Exception e){ans = 0;}
		
		String[] values = inf.getValues(getKey() + "optionvalue");
		if (values != null)
			for (String s : values)
				pushOption(s);
		if (ans >= options.size()) ans = 0;
	}
}










